物理治療門診預約系統 - 混合雲架構規格書

專案目標:建立一個高隱私、零月租、多日曆聚合(Multi-Calendar Flattening)且掛鉤櫃檯現場繳費確認(Asynchronous Confirmation)的物理治療預約系統。

1. 摘要與部署挑戰 (Abstract & Problem)

挑戰 (Challenge)

實做混合雲(Hybrid Cloud)預約系統之核心挑戰,在於跨越外網安全邊界(Public Ingress)內網隱私數據(Private Local Core)的雙向通訊。系統必須在不暴露診所實體 IP、不進行路由器虛擬伺服器(Port Forwarding)設定的安全前提下,確保雲端預約事件(Cal.com Webhook)能以毫秒級延遲(Latency < 100ms)送達本地自動化引擎(n8n),並在本地維持一個具備生存時間(TTL, Time-to-Live)的異步繳費狀態機。

限制條件 (Constraints)

2. 架構元件與 SRI 層級 (SRA)

元件名稱 (Component) 建議選型 (Tech Stack) 信賴層級 (SRI Tier) 部署位置 (Location)
預約前端門戶 Cal.com (Cloud Individual) Tier A (SOTA 級排程) 雲端 (SaaS)
邊界安全安全隧道 Cloudflare Tunnel (Cloudflared) Tier A (零信任安全標準) 雲端 + 本地雙向
自動化狀態機引擎 n8n (Self-hosted Community) Tier A (最強開源工作流) 本地 (Docker)
狀態持久化層 PostgreSQL / SQLite Tier A (結構化 ACID 標準) 本地 (Docker)
通知關閘 LINE Notify / LINE Bot API Tier B (台灣在地主流) 雲端 API 呼叫

3. 技術規格書 (Technical Specification)

硬體設備需求 (Hardware Specification)

環境初始化部署 (Docker Compose)

version: '3.8'

services:
  postgres:
    image: postgres:16-alpine
    container_name: pt_clinic_db
    restart: always
    environment:
      POSTGRES_USER: clinic_admin
      POSTGRES_PASSWORD: SecurePassword2026!
      POSTGRES_DB: clinic_booking
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
    networks:
      - clinic_network

  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    container_name: pt_clinic_n8n
    restart: always
    ports:
      - "5678:5678"
    environment:
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=clinic_booking
      - DB_POSTGRESDB_USER=clinic_admin
      - DB_POSTGRESDB_PASSWORD=SecurePassword2026!
      - N8N_SECURE_COOKIE=false
    volumes:
      - ./n8n_data:/home/node/.n8n
    networks:
      - clinic_network
    depends_on:
      - postgres

  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: pt_clinic_tunnel
    restart: always
    command: tunnel --no-autoupdate run --token ${CLOUDFLARE_TUNNEL_TOKEN}
    networks:
      - clinic_network
    depends_on:
      - n8n

networks:
  clinic_network:
    driver: bridge

4. 核心工作流邏輯 (Core Workflow)

1. 預約建立工作流 (Booking Created Flow)

監聽 Cal.com Webhook 節點路徑 /v1/cal-webhook。將 bookingId、患者個資與時間寫入本地 postgres,並初始化狀態為 PENDING_PAYMENT

2. 「超時未繳費」釋放工作流 (TTL Timeout Janitor)

每 5 分鐘由 Cron 觸發,撈取建立超過 30 分鐘且仍為 PENDING_PAYMENT 的案件,自動向 Cal.com API 發送 PATCH /bookings/{id} 帶入 {"status": "REJECTED"},解鎖行事曆時段。

3. 櫃檯繳費確認工作流 (Counter Confirmation Flow)

櫃檯人員確認收錢後,透過前端介面或 Google Sheets 變更狀態,觸發 n8n 向 Cal.com 發送核准請求 /confirm。此時 Cal.com 將自動同步至博群復健診所行事曆,完成狀態閉環並發送 LINE 門診導引通知。